πββοΈ νμ μΆλ‘
νμ μΆλ‘ μ νμ μ€ν¬λ¦½νΈκ° μ°λ¦¬κ° μμ±ν μ½λμ λν΄μ μλμΌλ‘ νμ μ μΆλ‘ ν΄μ£Όλ κ²μ μλ―Ένλ€.
const person = {
name: "so",
born: {
where: "asd",
when: "1233",
},
died: {
where: "asi",
when: "nov,201",
},
}
// νμ
μ€ν¬λ¦½νΈλ‘ μΆλ‘ λ νμ
const person: {
name: string
born: {
where: string
when: string
}
died: {
where: string
when: string
}
}μ person μμ λ₯Ό 보면μ νμ μΆλ‘ μ΄ μ ννκ² μλνκ³ μλ κ²μ λ³Ό μ μλ€. νμ μΆλ‘ μ μ΄μ©νμ λ λ μ ννκ² νμ μ΄ μ ν΄μ§κ±°λ, κ΅³μ΄ λͺ μμ μΌλ‘ νμ μ μ ν νμκ° μμ λμλ νμ ꡬ문μ μλ΅νλ κ² κ°λ μ±μ λμ¬μ€λ€.
interface Product {
id: string
name: string
price: number
}
// λͺ
μμ μΌλ‘ νμ
μ λ€ μ ν κ²½μ°
function logProduct(product: Product) {
const id: number = product.id
const name: string = product.name
const price: number = product.price
console.log(id, name, price)
}
function logProduct(product: Product) {
const { id, name, price } = product
console.log(id, name, price)
}μ μμ μμ Product interfaceμμ νμ
μ μ΄λ―Έ μ μνκΈ° λλ¬Έμ κ΅³μ΄ ν¨μ λ΄λΆμμ μ μν νμκ° μμλ€.
κ·Έλ¬λ©΄ νμ νμ μΆλ‘ μ λ§‘κΈ°λ©΄ λλ κ±ΈκΉ?
μμ μ 리νλ νμ μμ€ν μ ν΅ν΄ λ°°μ λ κ°μ²΄ 리ν°λ΄κ³Ό ν¨μμ μΈμμ λ°νκ°μ λͺ μμ μΌλ‘ νμ μ μ μν΄ μ€ νμκ° μλ€.
λ¨Όμ κ°μ²΄ 리ν°λ΄μ κ²½μ° λͺ
μμ μΌλ‘ νμ
μ μ μνλ©΄ μμ¬ μμ± μ²΄ν¬κ° λμν΄ μμ±λ νμ
κ³Ό λΉκ΅ν΄ μ€νλ μ€λ₯λ₯Ό μ‘λλ° λμμ μ€ μ μλ€.
ν¨μμ κ²½μ° λ°ν κ°μ ν΅ν΄ μ€λ₯λ₯Ό λ§μ μ μλ€. λ€μ μμ λ₯Ό 보μ.
const cache: { [ticker: string]: number } = {}
function getQuote(ticker: string): Promise<number> {
if (ticker in cache) {
return cache[ticker] // Promise<number>κ° μλλΌ μλ¬
}
return fetch(`https://quotes.example.com/?q=${ticker}`)
.then(response => response.json())
.then(quote => {
cache[ticker] = quote
return quote
})
}μ μ½λλ μ΄λ―Έ μ‘΄μ¬νλ κ°μ κ²½μ° cache λ°μ΄ν°λ₯Ό κ°μ Έμ€κ³ cacheλ κ°μ΄ μλ€λ©΄ μλ‘ μμ²νλ ν¨μλ€. νμ§λ§ cacheκ°μ΄ μμ λ numberλ‘ λ°νλκΈ° λλ¬Έμ μλ¬λ₯Ό λμ Έμ£Όλ κ²μ λ³Ό μ μλ€.
μ΄μ²λΌ λ°ν νμ μ λͺ μν¨μΌλ‘μ¨ μ½λ μ체μ μΌλ‘ μΈμλ₯Ό λ£μμ λ κ²°κ³Ό κ°μ μμΈ‘ν΄ λ¬Έμλ‘μ¨ μν μ ν μ μμΌλ©°, κΈ°μ‘΄μ λͺ λͺ λ νμ μ κ·Έλλ‘ μ΄μ©ν μ μλ μ₯μ λ κ°μ§λ€. μλ μ½λλ₯Ό 보μ.
interface Vector2D {
x: number
y: number
}
function add(a: Vector2D, b: Vector2D) {
return { x: a.x + b.x, y: a.y + b.y } // {x:number y:number}
}
function add(a: Vector2D, b: Vector2D): Vector2D {
return { x: a.x + b.x, y: a.y + b.y }
}λ°νκ° νμ
λ λμΌνκ² Vector 2Dλ₯Ό μμνμ§λ§ λ€λ₯Έ νμ
μΌλ‘ λ°ν κ°μ΄ μΆλ‘ λλ κ²μ λ³Ό μ μλ€.
μ 리ν΄λ³΄λ©΄ λͺ μμ νμ μ΄ νμν κ²½μ°λ κ°μ²΄λ¦¬ν°λ΄μ μ μΈν΄ μμ¬μμ±μ²΄ν¬κ° νμνκ±°λ, ν¨μμ μΈμμ λ°νκ°μ νμνλ©°, λλΆλΆμ κ²½μ° νμ μΆλ‘ μ 맑겨λ λλ€κ³ νλ€.
π¦ λ€λ₯Έ νμ μ λ€λ₯Έ λ³μ μ°κΈ°
μλ°μ€ν¬λ¦½νΈλ λμ νμ μΈμ΄μ΄κΈ° λλ¬Έμ κ°μ λ³μμ λ€λ₯Έ νμ μ ν λΉν μ μμ§λ§ νμ μ€ν¬λ¦½νΈμμλ ν λΉν μ μλ€. μ΄ κ²½μ°μ λ€λ₯Έ νμ μ ν λΉνκΈ° μν΄μ μ λμ¨ νμ μΌλ‘ νμ μ λ μ’ν μ μλ€.
let id: string | number = "12-34-56"
id = 123νμ§λ§ μ΄λ¬ν κ²½μ°μ μ€νλ € stringκ³Ό numberμ κ³΅ν΅ λ©μλλ§ μ 곡ν΄μ£Όλ λ± μ¬μ©νκΈ° λ μ΄λ €μμ§λ€. μ°¨λΌλ¦¬ λ³λλ‘ λ³μλ₯Ό λλλ κ²μ΄ λμ λ°©λ²μ΄λ€.
π νμ λνκΈ°
νμ μ€ν¬λ¦½νΈκ° νμ μ μΆλ‘ ν λλ ν λΉλ κ°μ ν΅ν΄ ν λΉ κ°λ₯ν κ°λ€μ μ§ν©μ μ μΆνλ€.
interface Vector3 {
x: number
y: number
z: number
}
function getComponent(vector: Vector3, axis: "x" | "y" | "z") {
return vector[axis]
}
let x = "x"
let vec = { x: 10, y: 20, z: 30 }
getComponent(vec, x) // Argument of type 'string' is not assignable to parameter of type '"x" | "y" | "z"'μ μμ μμ let x= 'x'λ‘ μ μΈλμ΄ xλ³μμλ ν λΉν μ μλ νμ
μ κ³ λ €ν΄ stringνμ
μΌλ‘ μΆλ‘ νλ€. κ·Έλ κΈ° λλ¬Έμ μ νν "x" | "y" | "z"κ° νμν getComponentν¨μμ μΈμλ‘ μ λ¬ μ νμ
μλ¬κ° λ°μνλ€.
μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μλ κ°λ¨νκ² letλμ constλ‘ μμ ν μ μλ€. constλ‘ μ μΈνλ©΄ xμ νμ
μ΄ 'x'κ° λμ΄ νμ
μ΄ λ μ’νμ§κΈ° λλ¬Έμ μμ λ°μν μλ¬λ₯Ό λ§μ μ μλ€.
νμ§λ§ constλ‘ μ μΈνλ λ°©λ²μ κ°μ²΄μ λ°°μ΄μμλ μ¬μ ν λ¬Έμ κ° λλ€. λ°°μ΄μ κ²½μ°μ const x= [1,2,3]λΌκ³ νμ λ number[]λ‘ λ΄μΌν μ§ [number,number,number]λ‘ ν΄μΌν μ§ νμ
μΆλ‘ λ§μΌλ‘λ μ΄λ ΅λ€.
μ΄λ¬ν λ¬Έμ μ μ ν΄κ²°νκΈ° μν΄μλ λ¨Όμ λͺ μμ νμ μ μ λ¬ν΄ μ£Όλ λ°©λ²μ΄ μλ€. μ νν λ΄κ° μνλ νμ μΌλ‘ μ ν΄μ€ μ μλ€.
const arr = [1, 2, 3] // number[]
const arr2: [number, number, number] = [1, 2, 3]λ λ²μ§Έλ‘λ as const νμ
λ¨μΈμ ν΅ν΄ μ΅λν μ’μ νμ
μΌλ‘ μΆλ‘ νλ λ°©λ²μ΄ μλ€.
const arr = [1, 2, 3] as const // readonly [1,2,3]π νμ μ’νκΈ°
null 체ν¬/ undefined 체ν¬
νμ
μ’νκΈ°λ₯Ό λ΄κ° κ°μ₯ λ§μ΄ μΌλ κ²½μ°λ null μ²΄ν¬ λλ undefined 체ν¬μλ κ² κ°λ€. μ±
μμλ λνμ μΈ μμλ‘ null 체ν¬λ₯Ό 보μ¬μ€λ€.
const el = document.getElementById("foo") // HTMLElement | null
if (!el) throw new Error("Unable to find #foo")
el.innerHTML = "Party Time".blink()μ μμ μμ elκ°μ΄ nullμ΄ λ μ μκΈ° λλ¬Έμ 쑰건문μΌλ‘ λΆκΈ° μ²λ¦¬λ₯Ό ν΄μ€ κ²μ λ³Ό μ μλ€.
instanceofμ λ΄μ₯ ν¨μ
instanceofμ λ΄μ₯ ν¨μλ₯Ό μ΄μ©ν΄ νμ
μ μ’ν μ μλ€. instanceofλ₯Ό μ΄μ© μμ μ€μνλ μ μ λ°νμ μ°μ°μλ‘ prototype chainμ ν΄λΉ νκ²μ΄ μλμ§ νμΈνκ³ κ°μ νμΈνλ κ²μ μ΄ν΄νκ³ μ¬μ©ν΄μΌ νλ€.
function contains(text: string, search: string | RegExp) {
if (search instanceof RegExp) {
search
return !!search.exec(text)
}
return text.includes(search)
}
function contains(text: string, terms: string | string[]) {
const termList = Array.isArray(terms) ? terms : [terms]
termList
}μμ±μ²΄ν¬μ discriminated Union Type
λ λ€λ₯Έ νμ
μ μ’νλ λ°©λ²μΌλ‘ κ°μ²΄ νμ
μ κ²½μ° μμ± μ²΄ν¬λ₯Ό μ΄μ©ν΄ μ’ν μ μκ³ , 곡ν΅μ μμ±μ λ€λ₯Έ κ°μ κ°μ§κ² νλ discriminated union ꡬλ³λ μ λμ¨ νμ
μ μ΄μ©ν μ μλ€. μ€μ μ¬μ© κ²½νμ μμ± μ²΄ν¬μ discriminated Union Typeμ union TypeμΌλ‘ μ λ¬ν propsλ₯Ό λΆκΈ° μ²λ¦¬νκΈ° μν΄ λ§μ΄ μ¬μ©νλ€.
interface A {
a: number
}
interface B {
b: number
}
function pickAB(ab: A | B) {
if ("a" in ab) {
ab
} else {
ab
}
ab
}
interface UploadEvent {
type: "upload"
filename: string
contents: string
}
interface DownloadEvent {
type: "download"
filename: string
}
type AppEvent = UploadEvent | DownloadEvent
function handleEvent(e: AppEvent) {
switch (e.type) {
case "download":
e // DownloadEvent
break
case "upload":
e // UploadEvent
break
}
}μ¬μ©μ μ μ νμ κ°λ
νμ μ μ’νκΈ° μν λ§μ§λ§ λ°©λ²μΌλ‘ ν¨μλ₯Ό μ΄μ©ν΄ λ΄κ° μνλ νμ μΌλ‘ μ’νμ€ μ μλ€.
function isInputElement(el: HTMLElement): el is HTMLInputElement {
return "value" in el
}
function getElementContent(el: HTMLElement) {
if (isInputElement(el)) {
el // HTMLInputElement
return el.value
}
el // HTMLElement
return el.textContent
}νκΊΌλ²μ κ°μ²΄ μμ±νκΈ°
κ°μ²΄λ₯Ό μμ±ν λ μ£Όμν μ μ λμ μΌλ‘ μμ±μ μΆκ°νκΈ° λ³΄λ€ νμν μμ±λ€μ νλ²μ μμ±ν΄μΌ νμ μΆλ‘ μ μ΄μ μ μ΄μ©ν μ μλ€.
const pt = {}
pt.x = 3 // Property 'x' does not exist on type '{}'.
pt.y = 4 // Property 'y' does not exist on type '{}'.μ μμ μμλ μ²μ ptκ° {}λ‘ μΆλ‘ λκΈ° λλ¬Έμ μλ¬κ° λ°μνλ€. μ΄λ¬ν μμΉμ κΈ°μ‘΄ κ°μ²΄ λ΄μ©μ μ΄μ©ν΄ μλ‘μ΄ κ°μ²΄λ₯Ό λ§λ€ λμλ λμΌνκ² μ μ©λλ€.
const pt = { x: 3, y: 4 }
const id = { name: "Pythagoras" }
const namedPoint = {}
Object.assign(namedPoint, pt, id)
namedPoint.name // Property 'name' does not exist on type '{}'.μ μμ λ namedPointλ λμΌνκ² {}λ₯Ό κΈ°μ€μΌλ‘ μΆλ‘ μ΄ λμ΄ Object.assign()λ©μλλ₯Ό μ΄μ©ν΄μ μμ±μ μΆκ°ν΄λ μλ¬κ° λ°μλμλ€. μ΄μ μ ν΄κ²°νκΈ° μν΄μλ spread operatorλ₯Ό μ΄μ©ν μ μλ€.
const namedPoint = { ...pt, ...id } // const namedPoint: {name: string; x: number; y: number;}
namedPoint.nameμ 리νλ©°
νμ
μΆλ‘ μ μμ²λκ² νΈν λΆλΆμ΄μ§λ§, λ μ ννκ³ λ΄κ° μνλ νμ
μΌλ‘ μ¬μ©νκΈ° μν΄μλ λͺ
μμ μΌλ‘ μ¬μ©νκ±°λ as constλ₯Ό μ¬μ©ν μ μλ€λ μ μ μ μ μμλ€.